package top.jiangqiang.qyblog.core.base.service;

import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.github.yulichang.base.MPJBaseService;
import com.github.yulichang.query.MPJQueryWrapper;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.toolkit.MPJWrappers;
import com.github.yulichang.wrapper.DeleteJoinWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.github.yulichang.wrapper.UpdateJoinWrapper;
import top.jiangqiang.qyblog.core.base.entity.BaseEntity;

/**
 * @author jiangqiang
 * @date 2022-07-16
 */
public interface BaseService<T extends BaseEntity> extends MPJBaseService<T> {

    /**
     * 获取表信息
     *
     * @return
     */
    default TableInfo getTableInfo() {
        return TableInfoHelper.getTableInfo(getEntityClass());
    }

    /**
     * 获取当前实体类对应的表名
     *
     * @return
     */
    default String getTableName() {
        TableInfo tableInfo = getTableInfo();
        return tableInfo.getTableName();
    }

    /**
     * 可以重写此方法修改列表查询需要展示的字段
     *
     * @return
     */
    default MPJLambdaWrapper<T> listLambdaJoinWrapper() {
        return lambdaJoinWrapper();
    }

    /**
     * 根据id查询数据，并转换为指定类型
     *
     * @param id     主键
     * @param tClass 目标类型
     */
    default <V> V getById(Long id, Class<V> tClass) {
        //这里不能通过T::getId获取主键字段名
        String keyColumn = getTableInfo().getKeyColumn();
        return lambdaJoinWrapper().eq(keyColumn, id).one(tClass);
    }

    default MPJLambdaWrapper<T> lambdaJoinWrapper() {
        //参数是主表的类型
        return MPJWrappers.lambdaJoin(getEntityClass());
    }

    default MPJQueryWrapper<T> queryJoinWrapper() {
        return MPJWrappers.queryJoin(getEntityClass());
    }

    default DeleteJoinWrapper<T> deleteJoinWrapper() {
        return JoinWrappers.delete(getEntityClass());
    }

    default UpdateJoinWrapper<T> updateJoinWrapper() {
        return JoinWrappers.update(getEntityClass());
    }
}
